批量修改图片的 DPI
最近经常需要批量修改图片的 DPI,原以为有很多软件可以做到,谁知找了几个都只有批量修改图片尺寸等功能,而不能批量修改 DPI,于是查了一些资料,自己写了一个 Python 脚本,在这儿记录分享一下。
什么是图片的 DPI
DPI 是“Dots Per Inch”的缩写,直译为“每英寸点数”,表示每英寸长度中的点数或像素数。DPI 通常用于打印和扫描场景,在打印和扫描过程中,DPI 值越高,图像的分辨率和质量越好。
在计算机显示屏上查看图像时,我们通常关注的是 PPI(Pixels Per Inch,每英寸像素),它表示屏幕上每英寸的像素数。PPI 值越高,屏幕上显示的图像质量越好,细节和清晰度也越高。
DPI 和 PPI 有时都被翻译为“分辨率”,其实它们是两个不同的概念。我们平时在电脑或手机上查看图片时,接触得比较多的是 PPI,比如说一张图片的分辨率是 1024*768,说的就是 PPI,表示它在显示器上显示时宽度是 1024 像素,高度是 768 像素。而 DPI 则是一个单独的数字,比如 72、300 等等。一般 Web 上的图片常见的 DPI 是 72,用于高清打印的图片一般要求 DPI 是 300。
一张 PPI 是 1024*768 的图片,它的 DPI 可以是 72,可以是 300,也可以是其他值,DPI 不会影响图片在电脑或手机屏幕上显示的效果,不过在打印时,内容和尺寸相同的图片,DPI 越高打印出来的尺寸越小,不过相应地清晰度会更高。
简单来说,可以这样理解,对同一张图片来说,它包含的信息是固定的,DPI 越低,打印时尺寸就越大,就像在屏幕上将它放大了看一样,自然就会显得模糊,而 DPI 越高,打印时尺寸越小,就像把图片缩小了看一样,自然就会显得清晰。
不同 DPI 设置在打印时的尺寸换算公式如下:
\[尺寸(英寸)= 分辨率(像素)/ DPI(每英寸点数)\]
因此,当 DPI 为 72 时,打印尺寸为:
- 水平尺寸:1024 像素 / 72 DPI = 14.22 英寸
- 垂直尺寸:768 像素 / 72 DPI = 10.67 英寸
当 DPI 为 300 时,打印尺寸为:
- 水平尺寸:1024 像素 / 300 DPI = 3.41 英寸
- 垂直尺寸:768 像素 / 300 DPI = 2.56 英寸
尽管打印尺寸有所不同,但图像的实际像素分辨率(1024×768)保持不变。
脚本
DPI 信息通常存储在图片文件的元数据中,通过 Python + PIL 库,我们可以很方便地修改图片的 DPI 值。
下面是我写的批量修改图片 dpi 的 Python 脚本:
import argparse
import os
from PIL import Image
def batch_set_dpi(input_dir, dpi, start_number):
input_folder = input_dir
output_folder = f"{input_dir}_dpi_{dpi}"
if not os.path.exists(output_folder):
os.makedirs(output_folder)
image_files = [f for f in os.listdir(input_folder) if f.split(".")[-1].lower() in ["jpg", "jpeg", "png"]]
total_images = len(image_files)
processed_images = 0
for file_name in image_files:
input_path = os.path.join(input_folder, file_name)
output_file_name = f"{start_number:03d}.jpg"
output_path = os.path.join(output_folder, output_file_name)
with Image.open(input_path) as img:
img.save(output_path, format="JPEG", dpi=(dpi, dpi), quality=100)
processed_images += 1
start_number += 1
progress = (processed_images / total_images) * 100
print(f"Processed {processed_images}/{total_images} images ({progress:.2f}%).")
def main():
parser = argparse.ArgumentParser(description="Batch set DPI of images in a folder.")
parser.add_argument("dir", help="The input folder containing images.")
parser.add_argument("--dpi", type=int, default=300, help="The target DPI value (default: 300)")
parser.add_argument("--start_number", type=int, default=1, help="The starting number for output image filenames (default: 1)")
args = parser.parse_args()
batch_set_dpi(args.dir, args.dpi, args.start_number)
if __name__ == "__main__":
main()
其中最核心的部分其实只有一句:
img.save(output_path, format="JPEG", dpi=(dpi, dpi), quality=100)
其余部分都是处理参数、遍历文件、保存文件等操作。
用法很简单,比如将这个文件保存为 dpi.py,随后在命令行中按下面的方式调用即可:
python dpi.py <图片文件夹路径>
回车,脚本就会遍历指定文件夹下的所有图片文件,修改其 DPI 为 300,并保存到新文件夹中,不会覆盖原图。
这个脚本只是为了满足我自己的使用场景写的,功能较为简单,如果你有更复杂的需求,可以自行修改。
评论: